package de.fhhannover.inform.wari.gruppe14.ki;

import de.fhhannover.inform.wari.strategy.MoveStrategy;



/*
 * 26.01.2009 Seret-Ki hinzugefuegt sie schaut wieviel Steine man max stehlen kann
 * @author Kai
 */
public class SecretKI implements MoveStrategy
{
	//was ich ueber Modthden hinweg brauche 
	private boolean	gegnerSeiteLeer	= true;
	//aktueller durchlauf
	int			wieviele		= 0;
	int			wievieleINDEX	= 0;
	//maximale Erbsen gewinnen
	int			maxERBSEN		= 0;
	int			maxINDEX		= 0;





	//default-Konstruktor
	public SecretKI()
	{
	}





	@Override public String getGroupID()
	{
		return "Gruppe14";
	}





	@Override public String getStrategyName()
	{
		return "Secret-KI";
	}





	public String toString()
	{
		return(getGroupID() + ": " + getStrategyName());
	}





	@Override public int move(int[ ] myOriBeans, int[ ] oppOriBeans, int time)
	{
		System.out.println("\n\n\n\n\n\n\n###############################################################################");
		boolean gueltigeMulde = false;
		int[ ] myBeans = myOriBeans;
		int[ ] oppBeans = oppOriBeans;
		//
		//		
		//Nur einmal nachschauen ob der Gegner leer ist
		//true wenn gegner keine bohnen mehr hat
		gegnerSeiteLeer = pruefeGegnerSeiteLeer(oppOriBeans);
		System.out.println("gegnerSeiteLeer ==> " + gegnerSeiteLeer);
		//
		//
		maxERBSEN = 0;
		maxINDEX = 0;
		//
		//
		for (int i = 0; i < 6; i++)
		{
			System.out.println("\n\nMulde ==> " + i + "\n=============== original ===============");
			//Originale wiederherstellen
			myBeans = tiefeKopy(myOriBeans);
			oppBeans = tiefeKopy(oppOriBeans);
			ausgabe(myBeans, oppBeans, i);
			System.out.println("=============== original ===============");
			System.out.println("\n\n\nmyBeans[" + i + "] ==> " + myBeans[i]);
			System.out.println("\n1 ****************\nmaxERBSEN ==> " + maxERBSEN);
			System.out.println("maxINDEX ==> " + maxINDEX + "\n****************");
			wievielSteineKannMannKlauen(myBeans, oppBeans, i);
			System.out.println("\n2 ****************\nmaxERBSEN ==> " + maxERBSEN);
			System.out.println("maxINDEX ==> " + maxINDEX + "\n****************\n\n\n");
			//
			//
			//
			//System.out.println("\n\n####### ende ########");
			//ausgabe(myBeans, oppBeans, i);
			myBeans = tiefeKopy(myOriBeans);
			oppBeans = tiefeKopy(oppOriBeans);
			gueltigeMulde = gueltigeMulde(myBeans, maxINDEX);
			//System.out.println("gueltigeMulde ==> " + gueltigeMulde);
			if (gueltigeMulde == false)
			{
				maxINDEX++;
			}
		}
		//
		//
		//
		if (gegnerSeiteLeer == true)
		{
			System.out.println("\n???????????????????????????????????????? gegnerSeiteLeer ????????????????????????????????????????");
			myBeans = tiefeKopy(myOriBeans);
			for (int i = 0; i < 6; i++)
			{
				maxINDEX = pruefeGegnerVersorgung(myBeans, i);
			}
		}
		System.out.println("\n4 ****************\nmaxERBSEN ==> " + maxERBSEN);
		System.out.println("maxINDEX ==> " + maxINDEX + "\n****************");
		return maxINDEX;
	}





	private void wievielSteineKannMannKlauen(int[ ] myBeans, int[ ] oppBeans, int index)
	{
		System.out.println("\n##### wievielSteineKannMannKlauen ####");
		int letzteGetroffeneMulde = (myBeans[index] + index) % 12;
		//
		wieviele = 0;
		if (index == 0)
		{
			wievieleINDEX = 0;
		}
		//
		//
		bohnenVerteilen(myBeans, oppBeans, index);
		System.out.println("letzteGetroffeneMulde ==> " + letzteGetroffeneMulde);
		ausgabe(myBeans, oppBeans, index);
		//
		//
		//gegnerische Mulde wird getroffen
		if (letzteGetroffeneMulde >= 6 && 12 > letzteGetroffeneMulde)
		{
			//
			//
			//zaehle moeglich zufangende erbsen !!!
			letzteGetroffeneMulde %= 6;
			for (int i = letzteGetroffeneMulde; i >= 0; i--)
			{
				if (oppBeans[i] == 2 || oppBeans[i] == 3)
				{
					System.out.println("#################################### jjjjjjjjjjjjjjjjaaaaaaaaaaaaaaaaaaaaaaaaaaa !!!!!!!!!!!!!!  ==> " + oppBeans[i]);
					wieviele += oppBeans[i];
					wievieleINDEX = index;
					System.out.println("max: " + wieviele + "index: " + wievieleINDEX);
				}
				else
				{
					break;
				}
			}
			//
			//
			//Auswahl der zutreffenden Mulden
			if (wieviele > maxERBSEN)
			{
				maxERBSEN = wieviele;
				maxINDEX = wievieleINDEX;
			}
		}
	}





	private void bohnenVerteilen(int[ ] myBeans, int[ ] oppBeans, int index)
	{
		int beans = (myBeans[index] + index) % 12;
		boolean pruefer = true; //true myBeans   // fals oppBeans
		//bohnen auf felder verteilen
		beans = myBeans[index];
		myBeans[index] = 0;
		index++;
		for (int i = index; beans > 0; i++)
		{
			if (i == 6)
			{
				i = 0;
				if (pruefer == true)
					pruefer = false;
				else
					pruefer = true;
			}
			//aktuelle Mulde inkrementieren
			if (pruefer == true)
				myBeans[i]++;
			else if (pruefer == false)
				oppBeans[i]++;
			beans--;
		}
	}





	private boolean pruefeGegnerSeiteLeer(int[ ] gegnerBeans)
	{
		boolean gegnerSeiteLeer = true;
		for (int i = 0; i < 6; i++)
		{
			if (gegnerBeans[i] > 0)
				gegnerSeiteLeer = false;
		}
		return gegnerSeiteLeer;
	}





	//pr�ft, ob der Gegner von den Steinen der ausgew�hlten Mulde versorgt wird
	private int pruefeGegnerVersorgung(int[ ] myBeans, int index)
	{
		int wert = 0;
		int minWert = 48;
		int minIndex = 0;
		//index +anzahl landet mindestens in einer fremden Mulde
		if (index + myBeans[index] > 5)
		{
			wert = index + myBeans[index];
			if (wert < minWert)
			{
				minWert = wert;
				minIndex = index;
			}
		}
		//System.out.println("minIndex: "+minIndex);
		return minIndex;
	}





	private boolean gueltigeMulde(int[ ] myBeans, int index)
	{
		//wenn das gewaehlte Feld leer sein sollte
		if (myBeans[index] == 0)
		{
			return false;
		}
		return true;
	}





	private int[ ] tiefeKopy(int[ ] quelle)
	{
		int[ ] ziel = new int[quelle.length];
		for (int i = 0; i < quelle.length; i++)
		{
			ziel[i] = quelle[i];
		}
		return ziel;
	}





	private void ausgabe(int[ ] myBeans, int[ ] oppBeans, int index)
	{
		System.out.print("\t >>> index: " + index + "\n");
		for (int i = 5; i >= 0; i--)
		{
			System.out.print(" | " + myBeans[i]);
		}
		System.out.print(" | \n---------------------------------------\n");
		for (int i = 0; i < 6; i++)
		{
			System.out.print(" | " + oppBeans[i]);
		}
		System.out.print("\n\n");
	}
}
